package com.cskaoyan.javase._0abstract._3exercise;

/**
 * 公司正在开发一套员工管理系统，需要对公司内部存在的员工进行管理
 * 公司将员工分为三类，普通员工负责杂项工作，程序员负责技术开发，经理负责统筹规划
 * 普通员工包含3个属性：姓名、工号以及工资，行为是工作
 * 程序员包含3个属性：姓名、工号以及工资，行为是工作和加班（overtime work）
 * 经理包含4个属性：姓名、工号、工资以及奖金（bonus），行为是工作
 * 请使用所学的知识设计该员工系统
 * 要求类中提供必要的方法进行属性访问（description）
 *
 * 使用抽象类作为父类的优点:
 *      1.抽象类是抽象概念,它在体系中并不存在对象,
 *          修改抽象类,并不会对体系造成直接影响.
 *
 *      2.抽象类有抽象方法,抽象方法的作用是占位,抽象方法起着制定标准与规范的作用
 *
 * @since 09:29
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        BaseStaff bs;
        bs = new GeneralStaff("张三", 1, 10000);
        bs.work();
        bs.printStaff();
        bs = new Coder("李四", 2, 20000);
        bs.work();
        bs.printStaff();
        // 使用instanceof判读强转
        if (bs instanceof Coder) {
            ((Coder) bs).overtimeWork();
        }
        bs = new Manager("王五", 3, 30000, 100000);
        bs.work();
        if (bs instanceof Manager) {
            System.out.println(((Manager) bs).getBonus());
        }
        bs.printStaff();
    }
}

// 抽象员工类
abstract class BaseStaff {
    String name;
    int id;
    double salary;

    public BaseStaff(String name, int id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    public abstract void work();

    // 打印属性,作为子类默认实现
    public void printStaff() {
        System.out.println("id是" + id + "的员工,名字是" + name + ",他的薪水是" + salary);
    }

}

class GeneralStaff extends BaseStaff {
    @Override
    public void work() {
        System.out.println("杂项工作");
    }

    public GeneralStaff(String name, int id, double salary) {
        super(name, id, salary);
    }
}

class Coder extends BaseStaff {
    @Override
    public void work() {
        System.out.println("技术开发");
    }

    public void overtimeWork() {
        System.out.println("996");
    }

    public Coder(String name, int id, double salary) {
        super(name, id, salary);
    }
}

class Manager extends BaseStaff {

    private double bonus;

    public Manager(String name, int id, double salary, double bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    @Override
    public void work() {
        System.out.println("统筹规划");
    }

    public double getBonus() {
        return bonus;
    }

    @Override
    public void printStaff() {
        System.out.println("id是" + id + "的员工,名字是" + name + ",他的薪水是" + (salary + bonus));
    }
}